
#include <stdio.h>
#include <stdlib.h>
#include "draw.h"
#include "global.h"


/*

------x = c ----->
|
|
y = r
|
|

*/

/**
 * @description: 清屏
 * @return {*}
 */
void DrawClear(void)
{
    system("clear");
}

// 移动光标到y行x列
static void MoveCur(const int x,const int y)
{
    int i;
    for(i = 0; i < x; i++)
        printf("\33[2C");
    for(i = 0; i < y; i++)
        printf("\33[1B");
}

// 保存当前光标
static void SaveCur()
{
    //save cur and move to destination
    printf("\33[s");   
}

// 恢复之前的光标
static void ResumeCur()
{
    printf("\33[u");
}

// 绘制带颜色的方块 r行 c列
void DrawBlock(const int r,const int c,const int color)
{
    SaveCur(); // 保存光标
    MoveCur(c,r); 
    switch(color)
    {
         case BLACK     :printf("\033[40;30m  \033[0m");break;
         case RED       :printf("\033[41;30m[]\033[0m");break;
         case GREEN     :printf("\033[42;30m[]\033[0m");break;
         case YELLOW    :printf("\033[43;30m[]\033[0m");break;
         case BLUE      :printf("\033[44;30m[]\033[0m");break;
         case PURPLE    :printf("\033[45;30m[]\033[0m");break;
         case DEEP_GREEN:printf("\033[46;30m[]\033[0m");break;
         case WHITE     :printf("\033[47;30m[]\033[0m");break;
         case CLEAR     :printf("\033[8m  ");
         default:
         break;
    }
    fflush(stdout);
    ResumeCur();

}


/**
 * @description: 绘制游戏地图围墙
 * @param {int} ofs_r 行偏移
 * @param {int} ofs_c 列偏移
 * @param {int} height 高
 * @param {int} width 宽
 * @return {*}
 */
void DrawFence(int ofs_r,int ofs_c,int height,int width)
{
    // 画行 从上往下
    for(int r = ofs_r;r < ofs_r + height + 1;r++)
    {
        DrawBlock(r,ofs_c - 1,WHITE);
        DrawBlock(r,ofs_c + width,WHITE);
    }
    // 画行 从左往右
    for(int c = ofs_c - 1;c < ofs_c + width + 1;c++)
    {
        DrawBlock(ofs_r - 1,c,WHITE);
        DrawBlock(ofs_r + height ,c,WHITE);
    }
}

/**
 * @description: 绘制游戏地图围墙
 * @param {int} ofs_r 行偏移
 * @param {int} ofs_c 列偏移
 * @param {int} height 高
 * @param {int} width 宽
 * @return {*}
 */
void DrawMap()
{
    for(int i=0;i<20;i++)
    {
        for(int j=0;j<10;j++)
        {
            if(map[i][j])
            {
                DrawBlock(3+i ,3+j,mapcolor[i][j]);
            }
        }
    }
    
}

// 清一行
void DrawClearMapLine(int r)
{

    for(int i=r;i>=0;i--)
    {
        for(int j=0;j<10;j++)
        {
            if(map[i][j])
            {
                DrawBlock(3+i ,3+j,CLEAR);
            }
        }
    }
    
}

// 画行
void DrawMapLine(int r)
{
    for(int i=r;i>=0;i--)
    {
        for(int j=0;j<10;j++)
        {
            if(map[i][j])
            {
                DrawBlock(3+i ,3+j,mapcolor[i][j]);
            }
            
        }
    }
}



void DrawBlocks(int ofs_r,int ofs_c,int r,int c,unsigned char *array,int color)
{
    // 画行 从左往右，从上往下
    for(int y = 0;y<4;y++)
    {
        for(int x=0;x<4;x++)
        {
            if(array[4*y+x])
            {   
                if(r+y>=0)
                {
                    DrawBlock(r+ofs_r+y,c+ofs_c+x,color);
                }   
            }

        }
       
    }
    
}

void DrawClearBlocks(int ofs_r,int ofs_c,int r,int c,unsigned char *array,int color)
{
    // 画行 从左往右，从上往下
    for(int y = 0;y<4;y++)
    {
        for(int x=0;x<4;x++)
        {
            if(array[4*y+x])
            {
                DrawBlock(r+ofs_r+y,c+ofs_c+x,CLEAR);
            }

        }
       
    }
    
}


/**
 * @description: 绘制初始化
 * @return {*}
 */
void DrawInit(void)
{
    
    printf("\033[?25l"); // 隐藏光标

    

}


/**
 * @description: 绘制结束
 * @return {*}
 */
void DrawEnd(void)
{
    printf("\033[?25h"); // 恢复光标
    system("clear");
}


// 绘制游戏地图静态资源
void DrawGameMapInit(void)
{
    //DrawClear(); // 清屏
    // 绘制围墙
    DrawFence(3,3,20,10);
}